﻿using Microsoft.AspNetCore.Mvc;
using NewLife.Caching;

namespace newlife.cache.api.Controllers
{
    /// <summary>
    /// Redis 分布式锁操作
    /// </summary>
    public class RedisCacheLockController(FullRedis fullRedis) : RedisBaseController(fullRedis)
    {
        // 过期时间：平均业务耗时的 1.5 倍左右
        // 等待时间：业务耗时的 2/3 左右

        [HttpPost]
        public IActionResult Set(string key)
        {
            // 1.申请一个分布式锁：最长等待 3 秒，锁 5 秒后过期，未获取到锁不抛出异常
            // 2.可用 using 自动释放锁（释放等于提前使其过期，其他线程可申请锁，进而执行业务逻辑）
            var rlock = FullRedis.AcquireLock($"Lock:{key}", 3000, 5000, false);

            // 返回结果不为 null，成功拿到锁，执行业务逻辑
            return Ok(rlock != null);
        }
    }
}
